package main

import "C"
import (
	"database/sql"
	"fmt"
	"gitee.com/hakwolf/dbmagic/golib/internal/modules/memmap"
	"unsafe"
)

func NewMapObj(obj interface{}) uint64 {
	id := memmap.NewObjectId(obj)
	return uint64(id)
	//return (*C.char)(unsafe.Pointer(uintptr(id)))
}

func FreeMapobj(avId uint64) {
	id := memmap.ObjectId(avId)
	s := id.Free()
	switch s.(type) {
	case *sql.DB:
		fmt.Println("DB")
		db := s.(*sql.DB)
		db.Close()
	case *sql.Rows:
		fmt.Println("Rows")
		row := s.(*sql.Rows)
		row.Close() //如果内部close了，再次close没有影响 close里面判断会退出
	default:
		fmt.Println("default")

	}

}

func GetMapObj(avId uint64) interface{} {
	id := memmap.ObjectId(avId)
	return id.Get()
}

//export NewGoString
func NewGoString(s *C.char) *C.char {
	gs := C.GoString(s)
	id := memmap.NewObjectId(gs)
	return (*C.char)(unsafe.Pointer(uintptr(id)))
}

//export FreeGoString
func FreeGoString(p *C.char) {
	id := memmap.ObjectId(uintptr(unsafe.Pointer(p)))
	id.Free()
}

//export PrintGoString
func PrintGoString(s *C.char) {
	id := memmap.ObjectId(uintptr(unsafe.Pointer(s)))
	gs := id.Get().(string)
	print(gs)
}

//db *sql.DB

////export GetSqlDbConn
//func GetSqlDbConn(Id C.int, ret *C.struct_ResultInfo) {
//	//func Test(dbinfo *C.struct_DbInfo) *C.struct_ResultInfo {
//	//var
//	//cStruct.field1 = 10
//	//cString := C.CString("Hello from C")
//	//cStruct.field2 = (*C.char)(cString)
//
//	//fmt.Printf("Field1: %d\n", cStruct.field1)
//	//fmt.Printf("Field2: %s\n", C.GoString(dbinfo.server))
//	//server := C.GoString(dbinfo.server) //C.GoString(dbinfo.server)
//	//gouser := C.GoString(dbinfo.user)
//	//pwd := C.GoString(dbinfo.pwd)
//	//godb := C.GoString(dbinfo.db)
//	//goport := int(dbinfo.port)
//
//	hostModel := new(models.DHost)
//	hostInfo, err := hostModel.Detail(int(Id))
//	if err == nil {
//		var sqlDb *sql.DB
//		switch hostInfo.Databasetype {
//		case database.DSqlserver:
//			lvPort := int(hostInfo.Port)
//			sqlDb, err = sqldriver2.GetDB(&hostInfo.Host, &hostInfo.User, &hostInfo.Password, &hostInfo.Database, &lvPort)
//			//sqlDb.SetMaxIdleConns()
//			//sqlDb.SetMaxOpenConns()
//			//sqlDb.SetConnMaxLifetime()
//		case database.DMysql:
//			sqlDb, err = database.GetDbEng("mysql", hostInfo.Host, hostInfo.User, hostInfo.Password, "mysql", int(hostInfo.Port))
//
//		}
//		if err == nil {
//			//code = C.CString(err.Error())
//			//fmt.Println(sqldb)
//			ptr := unsafe.Pointer(sqlDb)
//			// 将结构体地址转换为整型
//			addr := uintptr(ptr)
//
//			//return C.struct_ResultInfo{strId: C.CString(strconv.Itoa(int(addr))), ers: C.CString("nil")} //, C.CString()
//
//			ret.strId = C.CString(strconv.Itoa(int(addr)))
//			ret.ers = C.CString("nil")
//			return
//
//		} else {
//			str := C.CString(err.Error())
//			//return C.struct_ResultInfo{strId: C.CString(strconv.Itoa(int(0))), ers: str} //, C.CString()
//			ret.strId = C.CString(strconv.Itoa(int(0)))
//			ret.ers = str
//			return
//
//		}
//
//	}
//
//}

//func ProcessQuery(strID, input *C.char, ret *C.struct_ResultInfo) {
//	addr, _ := strconv.Atoi(C.GoString(strID))
//	fmt.Printf("addr= %d", addr)
//	fmt.Println()
//	db := (*sql.DB)(unsafe.Pointer(uintptr(addr)))
//	rows, err := db.Query(C.GoString(input))
//
//	//rows.NextResultSet()
//	if err == nil {
//		//code = C.CString(err.Error())
//		//fmt.Println(sqldb)
//		ptr := unsafe.Pointer(rows)
//		// 将结构体地址转换为整型
//		addr := uintptr(ptr)
//
//		//return C.struct_ResultInfo{strId: C.CString(strconv.Itoa(int(addr))), ers: C.CString("nil")} //, C.CString()
//		ret.strId = C.CString(strconv.Itoa(int(addr)))
//		ret.ers = C.CString("nil")
//		return
//
//	} else {
//		fmt.Println("query: ", err)
//		str := C.CString(err.Error())
//		//return C.struct_ResultInfo{strId: C.CString(strconv.Itoa(int(0))), ers: str} //, C.CString()
//		ret.strId = C.CString(strconv.Itoa(int(0)))
//		ret.ers = str
//		return
//
//		//code = &Retinfo
//		//return code
//	}
//}
